Skip to content

ゲーム状態の取得

今、あなたはゲームの発表が直接端末に表示されるのを見ており、ゲームのダイナミクスをよりよく理解できるようになっています。しかし、これらの洞察はゲーム内で発生する特定のアクションに限られています。

すべてのプレイヤーの位置、健康、エネルギーなど、包括的なゲームデータにオンデマンドでアクセスできるとしたら、より便利ではありませんか?この情報は、脅威、機会、タイミングをより効果的に評価するのに役立ち、戦略的計画を大幅に改善できるでしょう。

前回のガイドで作成したボットに別のハンドラーを追加することを考えたなら、あなたは絶対に正しいです!

コードを書く

bot.luaファイルに戻り、既存のハンドラーを次のように更新します:

lua
Handlers.add(
  "HandleAnnouncements",
  { Action = "Announcement" },
  function (msg)
    ao.send({Target = Game, Action = "GetGameState"})
    print(msg.Event .. ": " .. msg.Data)
  end
)

ハンドラーへの調整内容:

  • より広範な役割を反映するために、"HandleAnnouncements"に名前を変更。
  • ゲームの最新状態を要求するための追加操作を追加。このゲームは、GetGameStateアクションタグに応じて応答するように設計されています。

発表を印刷したときに、次のようにしてInbox内の最新のメッセージを確認できます:

lua
Inbox[#Inbox]

このメッセージのDataフィールドには、ゲームの最新状態が含まれています。これには以下が含まれます:

  • GameMode : ゲームがWaitingまたはPlaying状態かどうか。
  • TimeRemaining : ゲームの開始または終了までの残り時間。
  • Players : 各プレイヤーの位置、健康、エネルギーなどの統計を含むテーブル。

しかし、これは単に読むだけでなく、最新の状態から情報を使用して他の自動化を行うためのさらなるステップを踏むことができます。

以下のように最新の状態を格納する新しい変数を定義しましょう:

lua
LatestGameState = LatestGameState or nil

この構文は、端末においてbot.luaファイルの後続のイテレーションをロードする際に、変数の既存の値を保持し、上書きするのではなく、nilの値を変数に割り当てます。

次に、以下のように別のハンドラーを実装します:

lua
-- Handler to update the game state upon receiving game state information.
Handlers.add(
  "UpdateGameState",
  { Action = "Announcement" },
  function (msg)
    local json = require("json")
    LatestGameState = json.decode(msg.Data)
    ao.send({Target = ao.id, Action = "UpdatedGameState"})
    print("Game state updated. Print \'LatestGameState\' for detailed view.")
  end
)

前のハンドラーからのゲームプロセスの応答には、値GameStateを持つアクションタグがあり、これによってこの二番目のハンドラーがトリガーされます。トリガーされると、ハンドル関数は組み込みのjsonパッケージをロードし、データをjsonに解析してLatestGameState変数に保存します。

このハンドラーは、状態が更新されたときにプロセスにメッセージを送信します。この機能の重要性は、次のセクションで説明されます。

以下のドロップダウンでbot.luaの最新コードを参照できます:

Updated bot.lua file
lua
LatestGameState = LatestGameState or nil

Handlers.add(
"HandleAnnouncements",
{ Action = "Announcement" },
function (msg)
  ao.send({Target = Game, Action = "GetGameState"})
  print(msg.Event .. ": " .. msg.Data)
end
)

Handlers.add(
"UpdateGameState",
{ Action = "GameState" },
function (msg)
  local json = require("json")
  LatestGameState = json.decode(msg.Data)
  ao.send({Target = ao.id, Action = "UpdatedGameState"})
  print("Game state updated. Print \'LatestGameState\' for detailed view.")
end
)

ローディングとテスト

いつものように、この新機能をテストするために、次のようにしてファイルをあなたのaosプレイヤー端末にロードします:

lua
.load bot.lua

その後、次のようにその名前を単に渡して、LatestStateVariableが正しく更新されたかどうかを確認します:

lua
LatestGameState

ゲームの最新状態へのリアルタイムアクセスにより、あなたのボットは情報に基づいた決定を下すことができ、次のアクションを決定します。次は、このデータを活用してアクションを自動化してみましょう🚶